perm filename PUZZLE.IL0[TIM,LSP] blob sn#736735 filedate 1983-12-29 generic text, type T, neo UTF8
(FILECREATED "24-FEB-83 11:26:22" {PHYLUM}<GABRIEL>PUZZLE.;6 5683   

      changes to:  (VARS TYPEMAX)
		   (FNS FIT PLACE REMOVE! TRIAL START DEFINEPIECE FRESHPUZZLES)

      previous date: "17-FEB-83 10:03:35" {PHYLUM}<GABRIEL>PUZZLE.;4)

(* 1-BASED, INTERLISP ARRAYS)

(* Copyright (c) 1982, 1983 by Xerox Corporation)

(PRETTYCOMPRINT PUZZLECOMS)

(RPAQQ PUZZLECOMS (
		   (CONSTANTS SIZE TYPEMAX D CLASSMAX P-MULT)
		   (FNS FIT PLACE REMOVE! TRIAL DEFINEPIECE START FRESHPUZZLES)
		   (BLOCKS
 		    (PUZZLEBLOCK
		     FIT PLACE REMOVE! TRIAL DEFINEPIECE START FRESHPUZZLES
		     (SPECVARS KOUNT)
		     (ENTRIES 
		      START FRESHPUZZLES)))
		   (MACROS CLASS PIECEMAX PUZZLE P PIECECOUNT)
		   (INITVARS (CLASS NIL)
			     (PIECEMAX NIL)
			     (PUZZLE NIL)
			     (P NIL)
			     (PIECECOUNT NIL)
			     (PUZZLETRACEFLG NIL))
		   (GLOBALVARS CLASS PIECEMAX PUZZLE P PIECECOUNT III PUZZLETRACEFLG)
		   (SPECVARS KOUNT)
		   (P (FRESHPUZZLES))))
(DECLARE: EVAL@COMPILE 

(RPAQQ SIZE 511)

(RPAQQ TYPEMAX 13)

(RPAQQ D 8)

(RPAQQ CLASSMAX 3)

(CONSTANTS SIZE TYPEMAX D CLASSMAX)
)
(DEFINEQ

(FIT
  (LAMBDA (I J)                                              (* JonL "16-FEB-83 14:50")
    (NOT (find K from 0 to (PIECEMAX I) suchthat (AND (P I (ADD1 K))
						      (PUZZLE (IPLUS J K)))))))

(PLACE
  (LAMBDA (I J)                                              (* JonL "16-FEB-83 21:07")
    (for K from 0 to (PIECEMAX I) do (if (P I (ADD1 K))
					 then (SETA PUZZLE (IPLUS J K) T)))
    (SETA
     PIECECOUNT
     (CLASS I)
     (SUB1 (PIECECOUNT (CLASS I))))
    (OR (find K from J to SIZE suchthat (NOT (PUZZLE K)))
	1)))

(REMOVE!
  (LAMBDA (I J)                                              (* JonL "16-FEB-83 21:07")
    (for K from 0 to (PIECEMAX I) do (if (P I (ADD1 K))
					 then (SETA PUZZLE (IPLUS J K) NIL)))
    (SETA
     PIECECOUNT
     (CLASS I)
     (ADD1 (PIECECOUNT (CLASS I))))))

(TRIAL
  (LAMBDA (J)                                                (* edited: "17-FEB-83 10:02")
    (bind (K ← 1) for I from 1 to TYPEMAX
       do (if (AND (NEQ 0 (PIECECOUNT (CLASS I)))
		   (FIT I J))
	      then (SETQ K (PLACE I J))
		   (if (OR (TRIAL K)
			   (EQ 1  K))
		       then (AND PUZZLETRACEFLG (printout NIL T "Piece" .TAB 
							  (ADD1 I) .TAB "at" .TAB (ADD1 K)))
			    (add KOUNT 1)
			    (RETURN T)
		     else (REMOVE! I J)))
       finally (PROGN (add KOUNT 1)
		      NIL))))

(DEFINEPIECE
  (LAMBDA (ICLASS II JJ KK)                                  (* JonL "16-FEB-83 17:15")
    (PROG ((INDEX 1))
          (for I from 0 to II do (for J from 0 to JJ
				    do (for K from 0 to KK
					  do (SETQ INDEX 
						   (ADD1 
						    (IPLUS I 
							   (ITIMES D 
								   (IPLUS J
									  (ITIMES D K))))))
					     (SETA P (IPLUS III (ITIMES P-MULT (SUB1 INDEX)))
						   T))))
          (SETA CLASS III ICLASS)
          (SETA PIECEMAX III INDEX )
          (if (NEQ III TYPEMAX)
	      then (add III 1)))))

(START
  (LAMBDA NIL                                                (* JonL "16-FEB-83 22:21")
    (for M from 1 to (ADD1 SIZE) do (SETA PUZZLE M T))
    (for I from 1 to 5 do (for J from 1 to 5
			     do (for K from 1 to 5
				   do (SETA PUZZLE (ADD1 (IPLUS I (ITIMES D (IPLUS J (ITIMES D K))))) NIL)))
	 )
    (for I from 1 to TYPEMAX do (for M from 1 to (ADD1 SIZE) do 
				     (SETA P (IPLUS I (ITIMES P-MULT (SUB1 M))) NIL)))
    (SETQ III 1)
    (DEFINEPIECE 1 3 1 0)
    (DEFINEPIECE 1 1 0 3)
    (DEFINEPIECE 1 0 3 1)
    (DEFINEPIECE 1 1 3 0)
    (DEFINEPIECE 1 3 0 1)
    (DEFINEPIECE 1 0 1 3)
    (DEFINEPIECE 2 2 0 0)
    (DEFINEPIECE 2 0 2 0)
    (DEFINEPIECE 2 0 0 2)
    (DEFINEPIECE 3 1 1 0)
    (DEFINEPIECE 3 1 0 1)
    (DEFINEPIECE 3 0 1 1)
    (DEFINEPIECE 4 1 1 1)
    (SETA PIECECOUNT 1 13)
    (SETA PIECECOUNT 2 3)
    (SETA PIECECOUNT 3 1)
    (SETA PIECECOUNT 4 1)
    (PROG ((M (IPLUS 2 (ITIMES D (IPLUS 1 D))))
	   (N 1)
	   (KOUNT 0))
          (if (FIT 1 M)
	      then (SETQ N (PLACE 1 M))
	    else (printout NIL T "Error"))
          (if (TRIAL N)
	      then (printout NIL T "Success in " KOUNT " trials.")
	    else (printout NIL T "Failure."))
          (TERPRI))))

(FRESHPUZZLES
  (LAMBDA NIL                                                (* JonL "16-FEB-83 21:12")
    (SETQ CLASS (ARRAY TYPEMAX))
    (SETQ PIECEMAX (ARRAY TYPEMAX))
    (SETQ PUZZLE (ARRAY (IPLUS SIZE 2))) 
    (SETQ P (ARRAY (ITIMES TYPEMAX
			   (IPLUS SIZE 1))))
    (SETQ PIECECOUNT (ARRAY (IPLUS CLASSMAX 1)))
    NIL))
)
(DECLARE: EVAL@COMPILE 

(PUTPROPS CLASS MACRO ((I)
  (ELT CLASS I)))

(PUTPROPS PIECEMAX MACRO ((I)
  (ELT PIECEMAX I)))

(PUTPROPS PUZZLE MACRO ((I)
  (ELT PUZZLE I)))

(PUTPROPS P MACRO ((I J)
  (ELT P (IPLUS (ITIMES (SUB1 J) P-MULT) I))))

(PUTPROPS PIECECOUNT MACRO ((I)
  (ELT PIECECOUNT I)))
)

(RPAQ? CLASS NIL)

(RPAQ? PIECEMAX NIL)

(RPAQ? PUZZLE NIL)

(RPAQ? P-MULT TYPEMAX)

(RPAQ? P NIL)

(RPAQ? PIECECOUNT NIL)

(RPAQ? PUZZLETRACEFLG NIL)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS CLASS PIECEMAX PUZZLE P PIECECOUNT III PUZZLETRACEFLG)
)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(SPECVARS KOUNT)
)
(FRESHPUZZLES)
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1003 4888 (FIT 1013 . 1229) (PLACE 1231 . 1602) (REMOVE! 1604 . 1901) (TRIAL 1903 . 
2464) (DEFINEPIECE 2466 . 2989) (START 2991 . 4348) (FRESHPUZZLES 4350 . 4886)))))
STOP